﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Domain.Model.Repositories;
using Domain.Model.Infracciones;
using Domain.Model.Base;
using Infrastructure.Base.Persistence;
using Domain.Model.Articulos;

namespace Infrastructure.Base.InDatabase
{

    public class BInfraccionRepository : InfraccionRepository
    {
        private List<Infraccion> lista;

        public BInfraccionRepository()
        {
            this.lista = new List<Infraccion>();
        }

        #region Métodos Heredados Generales

        public override void Insert(Infraccion entity)
        {
            ContextoInfraccion contexto = new ContextoInfraccion();
            TblInfraccion obj = new TblInfraccion();
            
            //Identidad
            obj.id = entity.Identity.Value.ToString();
            
            //Campos propios
            obj.codigo = entity.Codigo;
            obj.descripcion = entity.Descripcion;
            obj.esVigente = entity.EsVigente;
            obj.cantSMLVM = entity.CantSMLVM;
            
            //Objetos de Valor
            obj.nroArticulo = entity.Articulo.NroArticulo;
            obj.ley = entity.Articulo.Ley;
            obj.descripcionArticulo = entity.Articulo.Descripcion;

            contexto.AddToTblInfraccion(obj);
            contexto.SaveChanges();
            contexto.Dispose();
        }

        public override Infraccion FromId(ObjectIdentity id)
        {
            String idString = id.Value.ToString();
            ContextoInfraccion contexto = new ContextoInfraccion();
            
            TblInfraccion item = contexto.TblInfraccion.Where(I => I.id == idString).FirstOrDefault();
            contexto.Dispose();

            if (item != null)
            {
                Infraccion oInfraccion = new Infraccion(new InfraccionId(item.id), item.codigo, item.descripcion, int.Parse(item.cantSMLVM.ToString()), int.Parse(item.esVigente.ToString()), new Articulo(item.nroArticulo, item.ley, item.descripcionArticulo));

                //Asignar la llave primaria de la BD            
                oInfraccion.PK = item.pk_infraccion;

                return oInfraccion;
            }
            
            return null;
        }

        public override ObjectIdentity NextIdentity()
        {
            return new InfraccionId(Guid.NewGuid().ToString().ToUpper());
        }

        public override void Update(Infraccion entity)
        {
            String idString = entity.Identity.Value.ToString();            
            ContextoInfraccion contexto = new ContextoInfraccion();

            TblInfraccion obj = contexto.TblInfraccion.Where(I => I.id == idString).FirstOrDefault();

            //Identidad
            obj.id = entity.Identity.Value.ToString();

            //Campos propios
            obj.codigo = entity.Codigo;
            obj.descripcion = entity.Descripcion;
            obj.esVigente = entity.EsVigente;
            obj.cantSMLVM = entity.CantSMLVM;

            //Objetos de Valor
            obj.nroArticulo = entity.Articulo.NroArticulo;
            obj.ley = entity.Articulo.Ley;
            obj.descripcionArticulo = entity.Articulo.Descripcion;

            contexto.SaveChanges();
            contexto.Dispose();
        }

        public override void Remove(ObjectIdentity id)
        {
            String idString = id.Value.ToString();

            ContextoInfraccion contexto = new ContextoInfraccion();
            TblInfraccion obj = contexto.TblInfraccion.Where(I => I.id == idString).FirstOrDefault();

            contexto.DeleteObject(obj);
            contexto.SaveChanges();
            contexto.Dispose();
        }

        public override List<Infraccion> All()
        {
            ContextoInfraccion contexto = new ContextoInfraccion();
            List<TblInfraccion> listaBD = new List<TblInfraccion>();

            listaBD = contexto.TblInfraccion.OrderBy(I => I.descripcion).ToList();


            foreach (var item in listaBD)
            {
                Infraccion obj = new Infraccion(new InfraccionId(item.id), item.codigo, item.descripcion, int.Parse(item.cantSMLVM.ToString()), int.Parse(item.esVigente.ToString()), new Articulo(item.nroArticulo, item.ley, item.descripcionArticulo));
                obj.PK = item.pk_infraccion;

                lista.Add(obj);
            }

            contexto.Dispose();
            return lista;
        }

        public override int Count()
        {
            return All().Count;
        }

        #endregion

        #region Métodos de Base de Datos
        //internal int PKFromId(ObjectIdentity objectIdentity)
        //{
        //    ContextoInfraccion contexto = new ContextoInfraccion();

        //    TblInfraccion obj = contexto.TblInfraccion.Where(I => I.id == objectIdentity.ToString()).FirstOrDefault();

        //    contexto.Dispose();
        //    return obj.pk_infraccion;
        //}
        #endregion
    }
}
